# # -*- coding: utf-8 -*-
from flask import Flask
from flask_login import LoginManager
from myblog.admin import *
from . import settings


def create_app():
    app = Flask(__name__, static_folder='../static', template_folder='../templates')
    app.config.from_object(settings.DevelopmentConfig)
    # 将db注册到app中,因为app中有sqlalchemy的配置，拿到配置可以构造engine，构造session对象，封装到db对象中
    db.init_app(app)


    # 注册蓝图
    from myblog.urls import urls
    app.register_blueprint(urls)
    from werkzeug.exceptions import HTTPException
    from myblog.error import error_404, error_403, error_500
    app.register_error_handler(HTTPException, error_404)
    app.register_error_handler(403, error_403)
    app.register_error_handler(500, error_500)

    # admin
    from flask_babelex import Babel
    babel = Babel(app)
    app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN' # 中文汉化admin
    from flask_admin import Admin
    admin = Admin(app, name='博客后台', index_view= Home_Admin( url= '/backstage/'), template_mode='bootstrap4')
    admin.add_view(BlogUser_Admin(db.session, name='用户表' ))
    admin.add_view(MultiArticle_Admin( db.session, name='文章页' ,category='文章库' ))
    admin.add_view(MultiClassSub_Admin(db.session, name='文章分类' ,category='文章库' ))
    admin.add_view(PraiseArticle_Admin(db.session, name='文章点赞表' ,category='文章库' ))

    admin.add_view(ToolsNetPage_Admin(db.session ,name='工具页' ,category='工具库' ))
    admin.add_view(ToolsNet_Admin(db.session, name='工具分类' ,category='工具库' ))
    admin.add_view(PraiseTool_Admin(db.session, name='工具点赞表' ,category='工具库' ))

    admin.add_view(Sponsor_Admin(db.session, name='赞助表' ,category='其他库' ))
    admin.add_view(Speak_Admin(db.session, name='留言表' ,category='其他库' ))
    admin.add_view(DraftArticle_Admin(db.session, name='草稿表' ,category='其他库' ))
    admin.add_view(Visitor_Admin(db.session, name='游客表' ,category='其他库' ))
    admin.add_view(FileBlogView('./static/up/', name='文件管理'  ))
    admin.add_view(Logout_Admin( name='退出', url='Logout/'))

    # 配置flask-login
    login_manager = LoginManager()  # 实例化登录管理对象
    login_manager.init_app(app)  # 初始化应用
    login_manager.login_view = 'login'  # 设置用户登录视图函数 endpoint

    # 配置回调函数,必须配置
    # user session 记录的是用户 ID (user_id)，回调函数的作用就是通过 user_id 返回对应的 User 对象
    @login_manager.user_loader
    def load_user(userid):
        return db.session.query(BlogUser).filter(BlogUser.user_id == userid ).first()

    # 集成富文本插件
    ckeditor = CKEditor(app)  # 初始化扩展

    return app
